// 在函数里面不定参数的使用

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void printnum(int count, ...)
{
    va_list ptr;          // 相当于一个指针
    va_start(ptr, count); // 这个意思就是说把count后面参数的第一个地址放到ptr里面
    for (int i = 0; i < count; i++)
    {
        int num = va_arg(ptr, int); // 相当于从这个指针里面取int类型字节的长度，然后ptr+sizeof(int)
        printf("[%d]%d ", i, num);
    }
    va_end(ptr); // 把ptr置空

    // 总结大概意思就是，我们count代表后面有几个参数，但是我们不知道到底有多少个用count来计数，什么类型也不知道，假设我们后面的都是int，那我们就从
    // conut指针后面去四个字节，为下一个参数的值。
    // 但是假设类型不一样呢？下面说
}

void myprintf(char *fmt, ...)
{
    // 但是假设类型不一样呢？我们知道我们的printf的输入是有特点的格式的前面是一个字符串，字符串有占位符，占位符有不同的类型，也就是说我们可以
    // 从前往后读取不同的占位符根据他们的类型取不同的字节数，比如说%d取四个字节，我们有一个函数来解决这个问题vasprinft
    va_list ptr;
    va_start(ptr, fmt);
    char *res;
    int ret = vasprintf(&res, fmt, ptr); // 根据不同的类型读取一个个参数,失败返回-1
    if (ret != -1)
    {
        printf("%s",res);
        free(res);
    }
    va_end(ptr);
}
int main()
{
    printnum(3, 1, 2, 4);
    myprintf("%d-%d\n", 666, 777);
}